using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class DetectorCollider : MonoBehaviour
{
	[SerializeField]
	//Objetos que detectou
	private List<GameObject> objectsDetected;
	//Colisor mais próximo do min bound
	private Collider colliderMoreNear;
	//Menor distance corrente
	private float nearDistance = 1000;
	
	//Layer que tenta detectar
	[SerializeField]
	private LayerMask layerToDetect;
	
	void Awake () 
	{
		objectsDetected = new List<GameObject>();
	}
	
	//Está sem nada detectado ?
	public bool IsFree
	{
		get{ return (objectsDetected.Count == 0); }
	}
	
	//Get do colisor mais próximo do bound min
	public Collider GetColliderMoreNear
	{
		get{ UpdateObjectsOnRange(); return colliderMoreNear; }
	}
	
	//Get de um abjeto qualquer que detectou
	public GameObject GetAnyTarget
	{
		get 
		{ 
			if(objectsDetected == null || objectsDetected.Count== 0)
				return null;
			return  objectsDetected[0];
		}
	}
	
	/// <summary>
	/// Tenta conseguir um objeto que detectou da layer 
	/// </summary>
	/// <returns>
	/// Um objeto com a layer pedida
	/// </returns>
	/// <param name='layerToCheck'>
	/// Layer para checar
	/// </param>
	public GameObject GetObjectOfLayer(int layerToCheck)
	{
		UpdateObjectsOnRange();
		foreach(GameObject g in objectsDetected)
		{
			if(g.layer == layerToCheck)
			{
				return g;
			}
		}
		
		return null;
	}
	
	//Get dos objetos detectados
	public List<GameObject> GetObjects
	{
		get
		{
			UpdateObjectsOnRange();
			return objectsDetected;
		}
	}
	
	public void Update()
	{
		UpdateObjectsOnRange();
	}
	
	/// <summary>
	/// Atualiza a lista de objetos
	/// </summary>
	private void UpdateObjectsOnRange()
	{
		for(int i = 0; i < objectsDetected.Count; i++)
		{
			if(objectsDetected[i] == null)
			{
				objectsDetected.RemoveAt(i);
				i--;
			}
		}
	}
	
	private void OnTriggerEnter(Collider c)
	{
		if(Global.LayerIsOnLayerMask(layerToDetect, c.gameObject.layer))
		{
			if(!objectsDetected.Contains(c.gameObject))
			{
				objectsDetected.Add(c.gameObject);
				
				if(Mathf.Abs(c.bounds.max.y - collider.bounds.min.y) < nearDistance)
				{
					colliderMoreNear = c;
				}
			}
		}
	}
	
	private void OnTriggerExit(Collider c)
	{
		if(Global.LayerIsOnLayerMask(layerToDetect, c.gameObject.layer))
		{
			if(c.Equals(colliderMoreNear))
			{
				colliderMoreNear = null;
			}
			objectsDetected.Remove(c.gameObject);
		}
	}
}
